Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
Dismiss

cronで逆シングルクォーテーション を使いたい

閲覧: 2 回
最初の未読メッセージにスキップ

hanajipon

未読、
2003/12/17 2:12:392003/12/17
To:
こんにちは。

Redhat7.1 を使っています。
crontab -e で以下のコマンドを書きました。(よくあるパターンだと思います!
?)
0-59/5 * * * * (date; free; df; ps -ef) > /tmp/hoge.`date +'%m%d-%H%M'`

これをコマンドラインから実行すると正しく動くのですが、cron 登録すると
/bin/sh: -c: line 1: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 2: syntax error: unexpected end of file
って怒られちゃうんです。

P.S.
察しの通り、利用者から「ある時間帯に急に重くなる!!」と言われたので考えた
スクリプトです。他に良い方法があればご教示願います。

---
hanajipon @ mail.goo.ne.jp

Hideo Sir MaNMOS Morishita

未読、
2003/12/17 2:18:222003/12/17
To:

In article <brovld$2l3$1...@nn-os106.ocn.ad.jp>,

一度shell scriptにしてそれを呼び出すのが正しい。

--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37

IKEDA Kenji

未読、
2003/12/17 3:33:202003/12/17
To:
On Wed, 17 Dec 2003 16:12:39 +0900,
In article <brovld$2l3$1...@nn-os106.ocn.ad.jp>,
"hanajipon" <hana...@mail.goo.ne.jp> wrote:

> (よくあるパターンだと思います!

いいえ。

crontab の 6th field では % が特別な意味を持ちます。マニュアルを読みましょう。
その上で、お代官さまの言う通りにするのが吉。

--
池田研二 稲城駅前在住

hanajipon

未読、
2003/12/17 4:01:542003/12/17
To:
hanajipon です。

お代官様、IKEDA様、ありがとうございます。

"IKEDA Kenji" <noro...@mob.or.jp> wrote in message
news:868ylb2...@poe.mob.or.jp...


> On Wed, 17 Dec 2003 16:12:39 +0900,
> In article <brovld$2l3$1...@nn-os106.ocn.ad.jp>,
> "hanajipon" <hana...@mail.goo.ne.jp> wrote:
>
> > (よくあるパターンだと思います!
>
> いいえ。
>
> crontab の 6th field では % が特別な意味を持ちます。マニュアルを読みましょ
う。

¥でエスケープさせる事も難しそうですね。

> その上で、お代官さまの言う通りにするのが吉。

たしかにおっしゃる通りかと。
以下、言い訳・・・
このCronを実行するのはリモートにあるマシンなんです。操作してもらうのは Linux
初心者。
私がスクリプト書いて、メールで送って、FTPでPUTして、パーミッションとか気を付
けてもらって
・・・・などとさせていくより直接的で良いかなと・・すんません、不精しないで頑
張ります。

Nishi Hirotaka

未読、
2003/12/17 10:19:032003/12/17
To:
京都の西と申します。

<brp627$4de$1...@nn-os106.ocn.ad.jp>の記事において
hana...@mail.goo.ne.jpさんは書きました。

>¥でエスケープさせる事も難しそうですね。

Linux の crontab は本当に \ でエスケープできないんですか?

# そりゃ¥ではできないでしょうが

うちの crontab には

0 0 * * sun cd $HOME/hoge; ./hogehoge >$HOME/data/log`date "+\%y\%m\%d"`.html

みたいなのがあって、ふつーに動いているように思えます。
スクリプトにしないといけなかったのでしょうか。

--
西 浩孝 Nishi Hirotaka

京都大学大学院 理学研究科 動物生態学研究室 博士課程 3回
TEL: 075-753-4077

OOTANI TAKASHI

未読、
2003/12/17 11:55:512003/12/17
To:
Nishi Hirotaka <ni...@ecol.zool.kyoto-u.ac.jp> writes:
>>¥でエスケープさせる事も難しそうですね。
>
> Linux の crontab は本当に \ でエスケープできないんですか?

redhat8でやってみましたが、
\% は改行と見なされないものの \ がそのまま残ってしまうために、
出来たファイル名が、hoge.\12\17-\20\20 のようになってしまいますね。
/tmp/hoge.`date '+\%m\%d-\%H\%M' | sed -e 's/\\//g'` か?ちょっと何だかなぁ。
これはバグなのか仕様なのか。

あと、/tmp の直下に多数のファイルを作るのは、/tmpディレクトリ自体が肥大化する
ので(ファイルを消してもディレクトリは縮まらない)、1つ専用のディレクトリを
作ったほうがいいです。スクリプトの先頭で、mkdir /tmp/hoge 2>/dev/null とか。
--
tksotn

Takahide Nojima

未読、
2003/12/18 1:24:392003/12/18
To:
nojimaです。

man...@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes:

> > Redhat7.1 を使っています。
> > crontab -e で以下のコマンドを書きました。(よくあるパターンだと思います!
> > ?)
> > 0-59/5 * * * * (date; free; df; ps -ef) > /tmp/hoge.`date +'%m%d-%H%M'`
> >
> > これをコマンドラインから実行すると正しく動くのですが、cron 登録すると
> > /bin/sh: -c: line 1: unexpected EOF while looking for matching ``'
> > /bin/sh: -c: line 2: syntax error: unexpected end of file
> > って怒られちゃうんです。
> >
> > P.S.
> > 察しの通り、利用者から「ある時間帯に急に重くなる!!」と言われたので考えた
> > スクリプトです。他に良い方法があればご教示願います。
>
> 一度shell scriptにしてそれを呼び出すのが正しい。

上の見解に激しく同意します。crontabの内部の行には大したことはあまり
書けないと思った方がよいです。

自分もcronのコマンド行の挙動で良くわからなくなることが多々あり、困るので
調べました。RHL9のcronであるvixie-cron-3.0.1(vixie-cron-3.0.1-74.src.rpm)を
読むと、

1. man 5 crontab すればわかるとおり、ソース内部でも%文字単体は問答無用で
コマンドの区切とみなされる。
(do_command.c child_process()の実装)

2. \%については、

・sh -cに渡される部分(最初の%よりも前の文字列)は\%のまま渡される
(\が取り除かれてsh -cに渡されたりはしない)

・最初の単体の%以降(コマンドの標準入力として渡るデータ)では、
a) \% は %のみに変換されて渡される
b) %は\nに変換されて渡される
c) \'%以外の文字'は\'%以外の文字'のまま渡される。
(do_command.c child_process()の実装)

3. '\+改行'でcrontabの行の次の行にコマンドの続きを書く等
は全く出来無い。とにかく一行にしか書けない。
(misc.c get_string(),entry.c load_entry()の実装)

となります。以上1~3より、

a) プログラムの構造上簡単なコマンドぐらいしかcrontabには書けない
ので、ちょっと複雑なこと書こうと思ったらシェルスクリプトにした方が良い。

b) コマンドに'%'混っていたらシェルスクリプトにしないとRHL9のcronでは
意図どおりに動作しない。(\%してcronの解釈をエスケープできるが、sh -cに
\%がそのまま渡ってしまう)

c) 実行されるかどうかの挙動が良くわからなければ、

sh -c 'crontabのコマンド部分に書いたものをそのまま書く'

で実行できるか調べてみると良い場合もある
(勿論ですが、-cに指定するのは%前までのコマンド部分です。また、
カレントディレクトリ、PATH/HOME等の環境変数が異なる場合があります
ので完全な事前テストにはなりませんが)


Yoshihiko SARUMARU

未読、
2003/12/18 1:49:372003/12/18
To:
 猿丸です。

fj.os.linux,fj.unix.shells の <ullpbi...@anet.ne.jp> の記事において
2003-12-18(木) 01:55頃、tks...@anet.ne.jpさんは書きました。

> > Linux の crontab は本当に \ でエスケープできないんですか?
>
> redhat8でやってみましたが、
> \% は改行と見なされないものの \ がそのまま残ってしまうために、
> 出来たファイル名が、hoge.\12\17-\20\20 のようになってしまいますね。
> /tmp/hoge.`date '+\%m\%d-\%H\%M' | sed -e 's/\\//g'` か?ちょっと何だかなぁ。
> これはバグなのか仕様なのか。

そりゃ quote すれば、そうなりますね……。
単に /tmp/hoge.`date +\%m\%d-\%H\%M` とすれば shell が \% を %
にしてくれます。
# quote したければ、/tmp/hoge.`eval date +'\%m\%d-\%H\%M'` です
#かね…… :D

shell script にした方がいいかは、crontab を設定するだけで済む
のをとるか、はまるポイントを少なくするのをとるか、どっちをとるか
によると思います。
--
猿丸芳彦 (Yoshihiko Sarumaru)
mail: mis...@imasy.or.jp web: http://www.imasy.or.jp/~mistral/

Takahide Nojima

未読、
2003/12/18 3:16:232003/12/18
To:
nojimaです。

Takahide Nojima <noj...@taito.co.jp> writes:

> 上の見解に激しく同意します。crontabの内部の行には大したことはあまり
> 書けないと思った方がよいです。

間違いでした。

bash -c 'xxxx'って相当強力なんですね。

bash -c 'mkdir /tmp/foo;cd $HOME/doc/foo;for i in *;do xxx $i > /tmp/foo/$i.`date +%y%m%d`;done'

とかあっさり動きました。

#もちろん1行で書きまくった場合、保守の問題等がでてきそうなので、良いかどうか
#は不明。

> a) プログラムの構造上簡単なコマンドぐらいしかcrontabには書けない
> ので、ちょっと複雑なこと書こうと思ったらシェルスクリプトにした方が良い。

というわけで、これは嘘となり、RHL9では
全部で1000文字(vixie-cronソース中MAX_COMMANDで定義)以内で収まるなら、

・シェルスクリプトでも、
・一行で全部かいても

OKとなります。保守の問題など考えなければどちらでも結構かなと。

> b) コマンドに'%'混っていたらシェルスクリプトにしないとRHL9のcronでは
> 意図どおりに動作しない。(\%してcronの解釈をエスケープできるが、sh -cに
> \%がそのまま渡ってしまう)

これも嘘で、\%はSHELL=bashの場合、bashによりquoteさえしてなければ%のみに
変換されて解釈されるようです。知らなかった...

OOTANI TAKASHI

未読、
2003/12/18 9:28:362003/12/18
To:
tksotnです

mis...@imasy.or.jp (Yoshihiko SARUMARU) writes:
> 2003-12-18(木) 01:55頃、tks...@anet.ne.jpさんは書きました。


>> redhat8でやってみましたが、
>> \% は改行と見なされないものの \ がそのまま残ってしまうために、
>> 出来たファイル名が、hoge.\12\17-\20\20 のようになってしまいますね。
>> /tmp/hoge.`date '+\%m\%d-\%H\%M' | sed -e 's/\\//g'` か?ちょっと何だかなぁ。
>> これはバグなのか仕様なのか。
>
> そりゃ quote すれば、そうなりますね……。

先の投稿では、cronで\をはずして欲しいような気がして書きましたが、
よく考えるとまずいですね。%を含んだコマンドラインより\を含んだ
コマンドラインのほうが多いでしょうが、cronで\をはずすと、shで直接
実行するコマンドラインよりもう一回余分に\をquoteしないといけなくなる。
Nojimaさんの書かれているようにshellに渡す部分と標準入力に渡す部分で
仕様が違うのもうなずけます。

> shell script にした方がいいかは、crontab を設定するだけで済む
> のをとるか、はまるポイントを少なくするのをとるか、どっちをとるか
> によると思います。

わたしも今まで、crontabのコマンドには、/bin/sh $HOME/lib/scriptname
しか書いたことが無いです。環境変数のセットとか出力のリダイレクトも
スクリプト中でやってます。
そういうこともあって今回の記事を見るまで%の機能は気づいておらず、
最近の機能かと思ったんですが、調べるとversion7の頃にはあったんですね。
--
tksotn

NAKAMURA Kazushi

未読、
2003/12/18 9:32:442003/12/18
To:
中村和志@神戸です。crontabについては皆さんから適切な助言が得られて
いますが、もっと別の観点から。

In article <brovld$2l3$1...@nn-os106.ocn.ad.jp>


hana...@mail.goo.ne.jp writes:
>察しの通り、利用者から「ある時間帯に急に重くなる!!」と言われたので考えた
>スクリプトです。他に良い方法があればご教示願います。

と言われて、

>crontab -e で以下のコマンドを書きました。(よくあるパターンだと思います!?)

とやらかすのは、確かによくあるパターンですが、悪いパターンです。

そもそも重い時に、更に重くなるようなコマンドを起動して、問題の現象を
観測出来るのかという問題が有ります。職場でも同様のことをしようとした
連中が居て、結局、重たい時は起動に数分掛かってしまう為、目的の状態を
観測できなかったという。まるで不確定性原理というか、オシロのプローブ
が回路を乱してしまった状態みたい。
#ついでに今回のは同じコマンド(date)を2回fork&execしているのも無駄。
#shell変数に代入して使い回そう。

システム自体に備わっている機能を利用して(MINIXにすら存在しました)、
起動されるプロセスのアカウント情報を記録&調査してみてはいかがですか。
BSD系とSystemV系で体系がかなり違いますが、man sar, sa, lastcomm,
accton等を参照してください。
--
中村和志@神戸 <mailto:k...@kobe1995.net>
NAKAMURA Kazushi@KOBE <http://kobe1995.net/>
- Break the hate chain. No more kill!
administrator@127.1

Takahide Nojima

未読、
2003/12/18 20:01:272003/12/18
To:
nojimaです。

OOTANI TAKASHI <tks...@anet.ne.jp> writes:

> >> /tmp/hoge.`date '+\%m\%d-\%H\%M' | sed -e 's/\\//g'` か?ちょっと何だかなぁ。
> >> これはバグなのか仕様なのか。
> >
> > そりゃ quote すれば、そうなりますね……。
>
> 先の投稿では、cronで\をはずして欲しいような気がして書きましたが、
> よく考えるとまずいですね。%を含んだコマンドラインより\を含んだ
> コマンドラインのほうが多いでしょうが、cronで\をはずすと、shで直接
> 実行するコマンドラインよりもう一回余分に\をquoteしないといけなくなる。
> Nojimaさんの書かれているようにshellに渡す部分と標準入力に渡す部分で
> 仕様が違うのもうなずけます。

教えて君になって申し訳ないのですが、マニュアル引っくりかえしても、
サーチエンジンでもわからないのでお聞きします。

[Q] shで\%を%に自動で解釈する仕様って何故存在するのでしょうか?
この動作が必要となる理由(cronの振舞い以外で)ってどなたか
ご存じでしょうか?

> そういうこともあって今回の記事を見るまで%の機能は気づいておらず、
> 最近の機能かと思ったんですが、調べるとversion7の頃にはあったんですね。

自分も全く知りませんでした。ええ。

hanajipon

未読、
2003/12/18 22:10:492003/12/18
To:
hanajipon@元ネタ発信者です。

"NAKAMURA Kazushi" <k...@kobe1995.net> wrote in message
news:0312182332...@ns.kobe1995.net...
> 中村和志@神戸です。crontabについては皆さんから適切な助言が得られて


> >crontab -e で以下のコマンドを書きました。(よくあるパターンだと思います!
?)
>
> とやらかすのは、確かによくあるパターンですが、悪いパターンです。
>
> そもそも重い時に、更に重くなるようなコマンドを起動して、問題の現象を
> 観測出来るのかという問題が有ります。職場でも同様のことをしようとした
> 連中が居て、結局、重たい時は起動に数分掛かってしまう為、目的の状態を
> 観測できなかったという。まるで不確定性原理というか、オシロのプローブ
> が回路を乱してしまった状態みたい。

確かにあんまりスマートではないとは思いますが、その「重さ」にもよるのでは
ないでしょうか?NAKAMURAさんのパターンは例えばシェルで1文字入力しても
なかなか帰ってこない場合だったのでは?
今回はそこまで重くはないので、これで判明すれば、それはそれで良いのかと。

> システム自体に備わっている機能を利用して(MINIXにすら存在しました)、
> 起動されるプロセスのアカウント情報を記録&調査してみてはいかがですか。
> BSD系とSystemV系で体系がかなり違いますが、man sar, sa, lastcomm,
> accton等を参照してください。

ありがとうございます。
これらのコマンドはまったく知りませんでした。これから勉強してやってみます。
その際はまた質問させて頂くかと思いますが、その際は皆様よろしくお願いします。

IKEDA Kenji

未読、
2003/12/18 23:17:072003/12/18
To:
On 19 Dec 2003 10:01:27 +0900,
In article <m3oeu5zk...@nightmare.hm.taito.co.jp>,
Takahide Nojima <noj...@taito.co.jp> wrote:

> [Q] shで\%を%に自動で解釈する仕様って何故存在するのでしょうか?

そういう仕様だから。% だけを特別扱いしてるわけじゃない。

$ ps -p $$
PID TTY TIME COMD
22510 pts/8 0:00 sh
$ cat pureecho.c
#include <stdio.h>
main(int argc, char *argv[])
{
while (--argc) {
fputs(*++argv, stdout);
putchar(' ');
}
putchar('\n');
return 0;
}
$ cc pureecho.c
$ ./a.out \~\!\@\#\$\%\^\&\*\(\)\-\+
~!@#$%^&*()-+
$

もちろん、shell に限った話でもない。

--
池田研二 稲城駅前在住

Mito

未読、
2003/12/21 2:26:272003/12/21
To:
Takahide Nojima <noj...@taito.co.jp> writes:

> 教えて君になって申し訳ないのですが、マニュアル引っくりかえしても、
> サーチエンジンでもわからないのでお聞きします。
>
> [Q] shで\%を%に自動で解釈する仕様って何故存在するのでしょうか?
> この動作が必要となる理由(cronの振舞い以外で)ってどなたか
> ご存じでしょうか?

shell は \ を escape charactor として解釈します。$ や ' などをそ
のままの文字として扱いたい場合、\$、\' としますよね。たとえば、
echo \$ は $ を表示します。これと同様に \% は % をそのままの文字
として扱うというだけの意味です。

つまり、$ のように、本来なら特別な処理をすべき文字を、文字そのも
のとして扱うだけにとどめるというだけですので、特に % だからどう
ということではありません。

\ の例外は \ の後に改行がきた場合で、この場合は改行を削除してし
まいます。(まだ例外があるかも知れませんが)

また、"" や '' 内で \ が使用された場合はちょっと違いまして、\ 自
身は削除されません。

猿丸さんの記事にもありましたが、"" 内の \ を削除するには eval で
可能です。

たぶんこのへんのことは全て man sh すれば書いてあるはずですので、
ご自分で調べてみてください。(man bash かな?)

# 私はかなりいい加減に書いてますんで、鵜呑みにしないほうがよろ
# しいかということもありますんで... ^^;

--
12/21 15:28頃
水戸

Takashi SHIRAI

未読、
2003/12/21 5:08:542003/12/21
To:
 しらいです。

In article <m3ekuy7...@kzin.dip.jp>, Mito <co_...@ybb.ne.jp> wrote:
>また、"" や '' 内で \ が使用された場合はちょっと違いまして、\ 自
>身は削除されません。

 Bourne shell の眷族では '' と "" の意味は異なりますよ。例
えば「echo '$HOME'」と「echo "$HOME"」の違いを確認してみて下
さい。このことは man page にも載っている筈です。

 '' は全ての文字を純粋に文字として扱うため、meta character
が存在せず、それ故「\」も escape character ではありません。
一方 "" は「$」や「`」を meta charaster として扱いますので、
それらの meta character を純粋に文字として扱うために「\」が
escape character として扱われます。
 結果として、「$」「`」「\」「"」の 4 文字については、"" の
中で純粋に文字として扱うためには、それぞれ「\$」「\`」「\\」
「\"」と記述する必要があります。逆にこれ以外の文字を "" の中
で「\」で冠しても「\」は escape character たり得ませんので、
「\a」のように「\」+「文字」として扱われます。

 因みに、'' が escape character を持たないという事実は、同
時に '' の中に「'」自身を純粋に文字として表現する手段が存在
しないことも意味します。
 "" 中の「"」は上述のように「\"」として記述可能ですが、同様
のことが '' の中では出来ません。"" や '' を入れ子に用いる場
合には、こういった仕様を踏まえた上で配慮する必要があります。


>たぶんこのへんのことは全て man sh すれば書いてあるはずですので、
>ご自分で調べてみてください。(man bash かな?)

 man page にはそこまで詳しくは書かれていません。POSIX でも
規定されていないので、多分実装依存で構わないのだと思います。
実際は Bourne shell の仕様に合わせていることが多いですけどね。
--
しらい たかし

Mito

未読、
2003/12/21 7:04:292003/12/21
To:
shi...@unixusers.net (Takashi SHIRAI) writes:

> >また、"" や '' 内で \ が使用された場合はちょっと違いまして、\ 自
> >身は削除されません。
>
>  Bourne shell の眷族では '' と "" の意味は異なりますよ。例
> えば「echo '$HOME'」と「echo "$HOME"」の違いを確認してみて下
> さい。このことは man page にも載っている筈です。

あ、すみません、\% とかのことだけ考えていました。
確かに \$ なんかの配慮に欠けた上の説明では間違いですね。
ご指摘ありがとうございました。

# '$HOME' と "$HOME" の違いはもちろん知っています。

ところで「眷族」って何と読むんですか?
無知で恥ずかしいですが、初めて見ました。

> >たぶんこのへんのことは全て man sh すれば書いてあるはずですので、
> >ご自分で調べてみてください。(man bash かな?)
>
>  man page にはそこまで詳しくは書かれていません。POSIX でも
> 規定されていないので、多分実装依存で構わないのだと思います。
> 実際は Bourne shell の仕様に合わせていることが多いですけどね。

あらま、そうなんですか...と思って man sh してみましたが、
RHL9 には \ の扱いについてそこそこ書いてありましたよ。

FreeBSD 4.5-RELEASE(古っ) も確認してみましたが、こちらにもあ
りました。

しらい さんのお使いのシステムはなんですか?

# POSIX は見たことないですし、どうでもいいんですが。

--
12/21 21:04頃
水戸

Hideo Sir MaNMOS Morishita

未読、
2003/12/21 11:55:132003/12/21
To:

In article <m365ga7...@kzin.dip.jp>,
Mito <co_...@ybb.ne.jp> writes:

> shi...@unixusers.net (Takashi SHIRAI) writes:
> ところで「眷族」って何と読むんですか?
> 無知で恥ずかしいですが、初めて見ました。

「けんぞく」ですね。仏教の物語とかで良く使いますね。

一族とか子分とか、そんな感じ。

#ただ、私は子分のイメージが強いのでちょっと違和感。「我は阿修羅の眷属」
#とかね。bashはshの子分ってイメージではない。私なら「末裔」って言うか
#も知れない。


> > >たぶんこのへんのことは全て man sh すれば書いてあるはずですので、
> > >ご自分で調べてみてください。(man bash かな?)
> >
> >  man page にはそこまで詳しくは書かれていません。POSIX でも
> > 規定されていないので、多分実装依存で構わないのだと思います。
> > 実際は Bourne shell の仕様に合わせていることが多いですけどね。
>
> あらま、そうなんですか...と思って man sh してみましたが、
> RHL9 には \ の扱いについてそこそこ書いてありましたよ。
>
> FreeBSD 4.5-RELEASE(古っ) も確認してみましたが、こちらにもあ
> りました。

Solarisはかなり詳しい。

Mito

未読、
2003/12/21 14:31:482003/12/21
To:
man...@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes:

> > ところで「眷族」って何と読むんですか?
> > 無知で恥ずかしいですが、初めて見ました。
>
> 「けんぞく」ですね。仏教の物語とかで良く使いますね。
>
> 一族とか子分とか、そんな感じ。

ありがとうございました。
「眷属」なんてのもあるようですね...って↓は「眷属」のほうな
んですね。

> #ただ、私は子分のイメージが強いのでちょっと違和感。「我は阿修羅の眷属」
> #とかね。bashはshの子分ってイメージではない。私なら「末裔」って言うか
> #も知れない。

sh と bash は血(ソース)のつながりはありませんでしたよね?
私なら「ニセモノ」っていうかな?

ash は「末裔」でもいいかもしれないですけど。

# nvi くらいだと「末裔」、vim はもちろん「バッタモン」。;-P
--
12/22 04:28頃
水戸

Takahide Nojima

未読、
2003/12/21 19:40:362003/12/21
To:
nojimaです。

Mito <co_...@ybb.ne.jp> writes:

> > >たぶんこのへんのことは全て man sh すれば書いてあるはずですので、
> > >ご自分で調べてみてください。(man bash かな?)
> >
> >  man page にはそこまで詳しくは書かれていません。POSIX でも
> > 規定されていないので、多分実装依存で構わないのだと思います。
> > 実際は Bourne shell の仕様に合わせていることが多いですけどね。
>
> あらま、そうなんですか...と思って man sh してみましたが、
> RHL9 には \ の扱いについてそこそこ書いてありましたよ。
>

すみません。完璧に見落してました。man bashのページに

A non-quoted backslash (\) is the escape character. It preserves the
literal value of the next character that follows, with the exception of
<newline>.

とありますので、<newline>を除く「全部のキャラクタについて」キャラクタは
保存されるようです。

お騒がせしました。申し訳なかったです。


Takashi SHIRAI

未読、
2003/12/24 8:43:172003/12/24
To:
 しらいです。

In article <m365ga7...@kzin.dip.jp>, Mito <co_...@ybb.ne.jp> wrote:
>ところで「眷族」って何と読むんですか?
>無知で恥ずかしいですが、初めて見ました。

 なんか余り良い反応が返って来ない用語だったようですが、UNIX
関連の歴史は複雑なので、こういったややこしい用語を用いて事実
関係をうやむやにするという用途もあったりします :-)

 Bourne shell はその名のとおり Steve Bourne 氏の手によるも
のですが、Bourne 氏が Bell lab. から Sun に移ってしまったの
で、System V 陣営では David Korn 氏が独自に Korn shell を開
発することになります。
 System V は SVR4 で BSD や SunOS と統合されますが、SVR4 で
標準実装されているのもこの Korn shell です。これを元に POSIX
shell という規格が作られ、bash 2.xx は POSIX shell 準拠を謳
っています。

 一方、BSD 陣営では Sun に移った Bourne 氏を中心に job 制御
を搭載した jsh を開発しますが、BSD では C shell が優勢になっ
て来るので Bourne 氏は shell 開発から手をひいてしまいます。
 BSD はその後ややこしい裁判を経由して 4.4BSD-Lite に至る訳
ですが、その直前の 4.3BSD Net/2 で Bourne shell を全く一から
書き直した A shell が登場します。これ以降、Bourne shell が生
き残る環境は Sun OS のみとなります。

 更に別の流れとして bash と zsh があります。bash はご存知の
とおり GNU products の一つで、上のような流れとは全く独立して
開発されました。
 zsh ともなるともう既に Bourne shell 系とは呼び難い程に拡張
部分が大きいので、ここまで来ると「眷族」の系譜も怪しくなって
きますね。

# 他にも、Korn shell を free software として一から書き直し
#た pdksh とか、Debian project が ash を POSIX 準拠に改めた
#dash とか、亜流には色々あります。
# fdsh も一応 Bourne shell 系です :-)


>>  man page にはそこまで詳しくは書かれていません。POSIX でも
>> 規定されていないので、多分実装依存で構わないのだと思います。
>> 実際は Bourne shell の仕様に合わせていることが多いですけどね。
>
>あらま、そうなんですか...と思って man sh してみましたが、
>RHL9 には \ の扱いについてそこそこ書いてありましたよ。

 \ と quote との関係については 7th edition の頃から man page
に載っているので、亜流も含めて他の Bourne shell 系 shell の
man page にも載っていると思います。POSIX shell の仕様として
も明記されています。
 前の記事で意図していたのはそういった局所的なことではなくて、
quoting の rule 一般に関して「全て」が man page に載っている
訳ではないということだったんです。
 流石に eval まで出て来ると実装依存の部分が大きいので、「全
て」は書かれていないと。ちょっと急いでたのでこの辺の説明を端
折ってしまいました。

 eval とか `` とかを通すと shell の parser 部分を複数回処理
されることになります。
 例えば quote の閉じる側の問題が一番顕著でしょうかね。二段
目以降の parser は PS2 を使って追加の入力行を得ることが出来
ませんので、閉じられなかった quote をどう処理するかが実装依
存になりますね。
 Bourne shell は勝手に quote を補って処理しますが bash はこ
とごとく error 扱いにします。他の shell はこの中間で、場合に
よっては quote を補ったかのように振舞い、別の場合では error
として扱います。
 この辺りの実装は実際に現物とつき合わせて調べてみないと判ら
ないので、de-facto standard を探すだけでも一苦労ですね。

 因みに、man page の記述には "" の中の「\」「"」「`」「$」
についても言及がありますが、jsh の man page にはこれらに加え
て「,」も quote されるとあります。
 この仕様は jsh だけに存在するのですが、その理由は良く判り
ません。普通に「echo "\,"」とやっても「\,」と表示されるので、
普通の「,」ではなく何か特別な文脈で出て来るんだろうと思いま
すが、「,」って特に meta character として振舞ったりはしない
んですよね。謎の仕様です。


># POSIX は見たことないですし、どうでもいいんですが。

 今の POSIX だとこの辺りが参考になるでしょうか。

http://www.opengroup.org/onlinepubs/007904975/utilities/xcu_chap02.html

--
しらい たかし

新着メール 0 件